package com.zhu.classfile.attribute;

import com.zhu.classfile.constant.ConstantPool;

import java.nio.ByteBuffer;

/**
 * SourceFile 属性
 * JVM 规范：
 * SourceFile_attribute {
 *     u2 attribute_name_index;
 *     u4 attribute_length;
 *     u2 sourcefile_index;
 * }
 */
public class SourceFileAttribute implements AttributeInfo {

    // 1. 保留 cp 引用（在构造时传入）
    private ConstantPool constantPool;

    // 2. sourceFileIndex 在 readInfo 中填充
    private int sourceFileIndex;

    /**
     * 构造函数：只传入 cp，不传 index
     * index 要等到 readInfo 才能从 ByteBuffer 中读取
     *
     * @param constantPool 常量池引用
     */
    public SourceFileAttribute(ConstantPool constantPool) {
        this.constantPool = constantPool;
    }

    /**
     * 获取源文件名
     *
     * @return 源文件名，如 "HelloWorld.java"
     */
    public String getSourceFileName() {
        return constantPool.getUtf8(sourceFileIndex);
    }

    // ------------------------
    // 实现 AttributeInfo 接口
    // ------------------------

    /**
     * 从 ByteBuffer 中读取属性内容
     * 注意：attribute_name_index 和 attribute_length 已由调用者读取
     *
     * @param reader ByteBuffer 包装的读取器
     */
    @Override
    public void readInfo(ByteBuffer reader) {
        //  在这里读取 sourcefile_index // u2
        this.sourceFileIndex = Short.toUnsignedInt(reader.getShort());
    }

}